#include <iostream>

int &get_reference_local()
{
    int a = 199; // 局部变量a
    // return a; // 错误！不能返回局部变量的引用，a的生命周期在函数结束后结束
    int &b = a;                                                  // 创建引用b，指向局部变量a
    std::cout << "get_reference_local a = " << a << std::endl;   // a 的值
    std::cout << "get_reference_local &a = " << &a << std::endl; // a的地址
    std::cout << "get_reference_local &b = " << &b << std::endl; // b的地址（与a相同）
    std::cout << "get_reference_local b = " << b << std::endl;   // b的值（199）

    return b;
}

int &get_reference_local_static()
{
    static int a = 199; // 静态局部变量a，生命周期持续整个程序运行期间
    // cout << "get_reference_local_static &a = " << &a << endl;
    // return a; // 正确，可以正常返回a的引用
    int &b = a;                                                  // 创建引用b，指向静态局部变量a
    std::cout << "get_reference_local &a = " << &a << std::endl; // a的地址
    std::cout << "get_reference_local &b = " << &b << std::endl; // b的地址（与a相同）
    std::cout << "get_reference_local b = " << b << std::endl;   // b的值（199）

    return b; // 可以返回静态局部变量的引用
}

int main(int argc, char const *argv[])
{
    int a = get_reference_local_static(); // 调用函数获取静态局部变量a的引用

    std::cout << "a = " << a << std::endl;   // 输出a的值（199）
    std::cout << "&a = " << &a << std::endl; // 输出a的地址

    std::cout << "###########################" << std::endl;
    int b = 1000;
    std::cout << "&b = " << &b << std::endl;

    // int c = get_reference_local() = b; // 错误！不能将局部变量的引用与b关联
    int &c = get_reference_local() = b; // 注意c仍然是一个引用

    std::cout << "get_reference_local() = " << get_reference_local() << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "&c = " << &c << std::endl; // 如果是 int &c ，c = **, &c = 和 get refference local 中的局部变量 一样的地址，但是函数结束后，局部变量的值已经被销毁，c的值成为了垃圾值。
    return 0;
}
